
//
//  ZNWBStatusListViewModel.swift
//  ZNWeibo
//
//  Created by FunctionMaker on 2017/8/4.
//  Copyright © 2017年 FunctionMaker. All rights reserved.
//

import Foundation
import SDWebImage

class ZNWBStatusListViewModel {
    
    lazy var statusList = [ZNWBStatusViewModel]()
    
    func loadStatuses(isShouldPullUp: Bool, completion:@escaping (_ isSuccessful: Bool, _ newCount: NSInteger) -> ()) {
        
        let since_id = isShouldPullUp ? 0 : statusList.first?.status.id ?? 0
        //减一是为了过滤最后一条的重复项
        var max_id = !isShouldPullUp ? 0 : statusList.last?.status.id ?? 0
        max_id > 0 ? max_id -= 1 : ()
        
        ZNWBNetworkManager.shared.statusesList(since_id: since_id, max_id: max_id) { (list, isSuccessful) in
            
            // 网络请求失败，直接返回
            if !isSuccessful {
                completion(false, 0)
                
                return
            }
            
            var array = [ZNWBStatusViewModel]()
            
            for dict in list ?? [] {
                guard let model = ZNWBStatus.yy_model(with: dict)
                
                // 如果当前模型设置失败，继续设置下一个
                else {
                    continue
                }
                
                array.append(ZNWBStatusViewModel(model: model))
            }
            
            print("抓取到\(array.count)")
            
            if isShouldPullUp {
                self.statusList += array
                
                print("上拉刷新完成")
            } else {
                // option + cmd + 向左：折叠分支
                self.statusList = array + self.statusList
            }
            
            self.cacheSingleImage(list: array, finished: completion)
        }
    }
    
    
    /// 缓存本次刷新结果中微博配图数为一的配图。因为这样才方便知道单图的尺寸
    ///
    /// - Parameters:
    ///   - list: 微博数据模型
    ///   - finished: 完成回调闭包
    private func cacheSingleImage(list: [ZNWBStatusViewModel], finished:@escaping (_ isSuccessful: Bool, _ newCount: NSInteger) -> ()) {
        // 实例化调度组
        let group = DispatchGroup()
        
        /// 计算缓存的所有图像的大小
        var length = 0
        
        for viewModel in list {
            
            // 1. 判断图片数量
            if viewModel.picURLs?.count != 1 {
                continue
            }
            
            // 2. 图片数量为1
            guard let picString = viewModel.picURLs?[0].thumbnail_pic,
                  let url = URL(string: picString)
            else {
                continue
            }
            
            // 3. 下载图像
            // 下载完成将图片存入沙盒。如果沙盒中有该图片(通过用MD5加密的url作为路径)，就从本地沙盒图像加载，没有则发起网络请求。
            // *** 图片累积不能太大
            
            // 将任务入组
            group.enter()
            
            SDWebImageManager.shared().downloadImage(with: url, options: [], progress: nil, completed: { (image, _, _, _, _) in
                // image 为可选
                guard let image = image,
                      let data = UIImagePNGRepresentation(image)
                else {
                    return
                }
                
                // 图像缓存成功
                length += data.count
                
                // 更新单图大小，只有单图才会调整配图视图的大小
                viewModel.updateSingleImageSize(image: image)
                
                // 任务完成，出组。
                // ** 放在闭包的最后一句
                group.leave()
            })
        }
        
        // 监听调度组
        group.notify(queue: DispatchQueue.main) {
            print("缓存图片大小为\(length / 1024)KB")
            
            // 图片缓存完成，进行回调
            finished(true, list.count)
        }
    }
}
